2023/12/232172字符
泛型
/**
* 截取数组
* @param {*} arr 给定一段数组
* @param {*} n 截取数组前 n 项
*/
// <T> 给定一种类型,对函数进行类型约束
function take<T> (arr: T[], n: number): T[] { // <T = number> 设置默认类型
if (n >= arr.length) return arr;
const newArr: T[] = [];
for (let i = 0; i < n; i ++) {
newArr.push(arr[i])
}
return newArr;
}
take<number>([1, 2, 3, 4, 5], 3);
泛型-类型别名
type callback<T> = (n: T, i: number) => boolean;
function fillter<T> (arr: T[], callback: callback<T>): T[] {
const newArr: T[] = [];
arr.forEach((n, i) => {
if (callback(n, i)) newArr.push(n);
})
return newArr;
}
fillter([1, 2, 3, 4, 5], n => n % 2 !== 0);
泛型-接口
interface callback<T> {(n: T, i: number): boolean}
function fillter<T> (arr: T[], callback: callback<T>): T[] {
const newArr: T[] = [];
arr.forEach((n, i) => {
if (callback(n, i)) newArr.push(n);
})
return newArr;
}
fillter([1, 2, 3, 4, 5], n => n % 2 !== 0);
泛型-类
class Car<T> {
fn (num: T) {
return num
}
}
let car = new Car();
console.log(car.fn(123));
泛型约束
interface A {name: string}
function toUpperCase<T extends A> (obj: T) {
obj.name = obj.name.split(' ')
.map(s => s[0].toUpperCase() + s.substr(1))
.join(' ');
return obj;
}
const obj = {
name: 'hello word',
age: 18,
}
const newObj = toUpperCase(obj);
console.log(newObj.name); //--> Hello Word
多泛型
// 混合两个数组
function mixinArray<T, K> (arr1: T[], arr2: K[]): (T | K)[] {
if (arr1.length != arr2.length) {
throw new Error('两个数组不等长');
}
let result: (T | K)[] = [];
for (let i = 0; i < arr1.length; i++) {
result.push(arr1[i]);
result.push(arr2[i]);
}
return result;
}
let arr = mixinArray([1, 2, 3], ['a', 'b', 'c']);
console.log(arr); //--> [1, 'a', 2, 'b', 3, 'c']